package br.com.lojaonlinefi.ejb;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author calos
 */
public abstract class BeanDeSessaoBasica implements java.io.Serializable {

    @PersistenceContext
    private EntityManager em;
    
    public EntityManager getEm() { // Criado com Ctrl+ espaço na classe BeanDeSessaoBasica
        return em;
    }

    public BeanDeSessaoBasica() { // Criado com Ctrl+ espaço na classe
    }
    // Criar uma lista limitada de registros para aumentar a velocidade
    public <T> List<T> getListaLimitada(Class<T> classToCast,String query, int limit, Object...values) {
        Query qr = createQuery(query, values);
        qr.setMaxResults(limit);
        return qr.getResultList();
    }

    // Apenas indicando a classe com um Cast, retorna um lista de todos os
    // atributos da mesma
        public <T> List<T> getLista(Class<T> classParaCast, String query, Object... values){
        Query qr = createQuery(query, values);        
        return qr.getResultList();
    }    
    
    // Apenas indicando a classe com um Cast, retorna uma lista de todos os
    // atributos da mesma
    public <T> List<T> getListaPorNome(Class<T> classParaCast, String namedQuery, Object... values){
        Query qr = em.createNamedQuery(namedQuery);
        if (values != null){
            for (int i = 0; i < values.length; i++){
                Object object = values[i];
                qr.setParameter(i+1, object);
            }
        }
        return qr.getResultList();
    }
    // Apenas indicando a classe com um Cast, retorna um objeto com o mesmo
    // tipo da classe indicada
    public <T> T getPojo(Class<T> classToCast, String query, Object... values){
        Query qr = createQuery(query, values);
        return (T) qr.getSingleResult();
        
    }
    
    public <T> T getPojoID(Class<T> classToCast, Serializable primaryKey){
        return em.find(classToCast, primaryKey);
    }
    
    public int execute(String query, Object... values){
        Query qr = createQuery(query, values);
        return qr.executeUpdate();
    }
        

    private Query createQuery(String query, Object[] values) {
        Query qr = em.createQuery(query);
        if (values != null){
            for (int i = 0; i < values.length; i++){
                Object object = values[i];
                qr.setParameter(i+1, object);
            }
        }
        return qr;
    }
    
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + (this.em != null ? this.em.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final BeanDeSessaoBasica other = (BeanDeSessaoBasica) obj;
        if (this.em != other.em && (this.em == null || !this.em.equals(other.em))) {
            return false;
        }
        return true;
    }
}
